home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / book / src / excmd.c < prev    next >
C/C++ Source or Header  |  1993-07-08  |  4KB  |  167 lines

  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3. #include    <stdarg.h>
  4. #include    <string.h>
  5. #include    <ctype.h>
  6. #include    <math.h>
  7. #include    <egb.h>
  8. #include    <snd.h>
  9. #include    <mos.h>
  10. #include    <exec.cf>
  11.  
  12. #include    <conio.h>
  13. #include    <msdos.cf>
  14.  
  15. #include    "book.h"
  16. #include    "lib.h"
  17. #include    "menu.h"
  18. #include    "cons.h"
  19. #include    "keyio.h"
  20. #include    "mouse.h"
  21. #include    "snd.h"
  22. #include    "excmd.h"
  23.  
  24.  
  25. EXCMD_t excmd[EXCMD_MAX];
  26. int     excmd_num = 0, excmd_len = 0;
  27.  
  28.  
  29. /*
  30.  *  外部コマンドの登録テーブルを初期化する
  31.  *
  32.  *  パラメータ: なし
  33.  *  戻り値:     なし
  34. */
  35. void    excmd_init(void)
  36. {
  37. int     i;
  38.  
  39.     for (i = 0; i < excmd_num; i++)
  40.         free(excmd[i]._base);
  41.     excmd_num = excmd_len = 0;
  42. }
  43.  
  44.  
  45. /*
  46.  *  外部コマンドをテーブルに登録する
  47.  *
  48.  *  パラメータ: コマンド情報
  49.  *  戻り値:     なし
  50. */
  51. void    excmd_apend(char *cmd)
  52. {
  53. EXCMD_t *ep;
  54. char    *tmp;
  55. int     len;
  56.  
  57.     if (excmd_num >= EXCMD_MAX || (tmp = strdup(cmd)) == NULL)
  58.         return;
  59.     (ep = &excmd[excmd_num++])->_base = tmp;
  60.  
  61.     ep->name = skipbl(tmp);
  62.     tmp = skipwd(skipbl(skipwd(tmp)));  /*  名前を飛び越える  */
  63.     if (*tmp != '\0')
  64.         *tmp++ = '\0';
  65.     ep->path = skipbl(tmp);
  66.     tmp = skipwd(ep->path);
  67.     if (*tmp != '\0')
  68.         *tmp++ = '\0';
  69.     ep->param = skipbl(tmp);
  70.  
  71.     if ((len = strlen(ep->name)) > excmd_len)
  72.         excmd_len = len;
  73. }
  74.  
  75. /*
  76.  *  拡張コマンドの起動
  77.  *
  78.  *  パラメータ: エントリの番号
  79.  *  戻り値:
  80.  *      FALSE   指定のエントリが存在しない時
  81.  *      TRUE    上記以外
  82. */
  83. int     exec_cmd(int num)
  84. {
  85. void    (*func)();
  86. EXCMD_t *ep;
  87. char    param[130];
  88. int     ret;
  89.  
  90.             void delay(void)
  91.             {
  92.                 Registers.CX.W = 1;  /* 10ms */
  93.                 callint(0xFD);
  94.             }
  95.  
  96.  
  97.     /*  指定番号のコマンドが設定されている?  */
  98.     if (num < 0 || num > excmd_num)
  99.         return FALSE;
  100.     ep = &excmd[num];
  101.  
  102.     strcpy(param+1, ep->param);
  103.     param[0] = strlen(param+1);
  104.  
  105.     /*  外部プロセス起動準備(キーボード設定、画面クリア)  */
  106.     kb_asign_push();
  107.     KAN_end();
  108.     EGB_displayPage(gwork, 0, 0);
  109.     MOS_disp(MOS_OFF);
  110.     cls(0, 0);
  111.     cls(1, 0);
  112.  
  113.     EGB_resolution(gwork, 0, 1);
  114.     EGB_resolution(gwork, 1, 1);
  115.     EGB_clearScreen(gwork);
  116.  
  117.     SND_fm_timer_a_set(0, 0);       /*  タイマ割り込み停止  */
  118.     SND_fm_timer_b_set(0, 0);       /*  タイマ割り込み停止  */
  119.     SND_fm_timer_b_set(1, 0xDD);    /*  タイマ割り込み設定  */
  120.  
  121.     EGB_displayPage(gwork, 0, 3);
  122. #if 0
  123.     while ((_inb(0x4d8) & 0x80) != 0) ;
  124.     _outb(0x4d8, 0x21);
  125.     _outb(0x4da, 0x00);     delay();
  126.  
  127.     while ((_inb(0x4d8) & 0x80) != 0) ;
  128.     _outb(0x4d8, 0x2c);
  129.     _outb(0x4da, 0x80);     delay();
  130.  
  131.     while ((_inb(0x4d8) & 0x80) != 0) ;
  132.     _outb(0x4d8, 0x27);     /* clear flag */
  133.     _outb(0x4da, 0x30);     delay();
  134.  
  135.     while ((_inb(0x4d8) & 0x80) != 0) ;
  136.     _outb(0x4d8, 0x26);     /* load to timer B */
  137.     _outb(0x4da, 0xdd);     delay();
  138.  
  139.     while ((_inb(0x4d8) & 0x80) != 0) ;
  140.     _outb(0x4d8, 0x27);     /* start */
  141.     _outb(0x4da, 0x2a);
  142. #endif
  143.  
  144.     /*  起動  */
  145.     ret = c_exec(ep->path, param);
  146.     errno = 0 ;
  147.  
  148.     SND_fm_timer_a_start();         /*  タイマ割り込み再開  */
  149.  
  150.     /*  画面の再初期化、キーボードアサイン復帰  */
  151.     init_screen();
  152.     KAN_start();
  153.     kb_asign_pop();
  154.  
  155. /*
  156.     if (ret != 0)
  157.     {
  158.         *param = '\0';
  159.         _strcats(80, param, "[", ep->path, "] の起動に失敗しました", NULL);
  160.         report_fatal_error(ERR_EXEC, param);
  161.     }
  162. */
  163.  
  164.     return TRUE ;
  165. }
  166.  
  167.